﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using PMSGSC.BLL;
using PMSGSC.DAL;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid;
using DevExpress.XtraGrid.Localization;

namespace PMSGSC.App
{
    public partial class frmStatusOfJob : DevExpress.XtraEditors.XtraForm
    {
        public frmStatusOfJob()
        {
            InitializeComponent();
            statusJobBindingSource.DataSource = StatusJob_BLL.GetAll(frmMain.ship.Ship_ID);
        }
        // Khai báo trạng thái mặc định 
        private Status status = Status.Update;
       
        // Tạo một đối tượng lưu trữ các thông tin trên View ==> truyền xuống các layer bên dưới
        private  StatusJob objStatus = new  StatusJob();
        //Hiển thị số thứ tự của gridview
        private void gridView1_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs e)
        {

            if (e.RowHandle >= 0)
            {
                e.Info.DisplayText = (e.RowHandle + 1).ToString();
            }
            
        }
        // Sự kiện cập nhật dữ liệu xuống databse
        private void gridView1_RowUpdated(object sender, DevExpress.XtraGrid.Views.Base.RowObjectEventArgs e)
        {
            SaveDataToDatabase();
        }

        private void SaveDataToDatabase()
        {
            objStatus = statusJobBindingSource.Current as  StatusJob;
            if (status == Status.Update)
            {
                if (XtraMessageBox.Show("Do you want to save changes?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                {
                    bool result = StatusJob_BLL.Update(objStatus);
                    if (!result)
                        XtraMessageBox.Show("Update Unsuccess !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    else
                        XtraMessageBox.Show("Update Success !", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                statusJobBindingSource.DataSource = StatusJob_BLL.GetAll(frmMain.ship.Ship_ID);
            }
            if (status == Status.New)
            {
                bool result = StatusJob_BLL.Insert(objStatus);
                if (!result)
                {
                    XtraMessageBox.Show("Insert Unsuccess!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                status = Status.Update;
            }
        }
        private void DeleteStatus(NavigatorButtonClickEventArgs e)
        {
            DeleteStatusFinal();
            e.Handled = true;
        }

        private void DeleteStatusFinal()
        {
            if (XtraMessageBox.Show("Are you sure you want to delete a Status?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
            {
                objStatus = statusJobBindingSource.Current as StatusJob;

                if (StatusJob_BLL.IsRelationship(objStatus))
                    StatusJob_BLL.Delete(objStatus);
                else
                    XtraMessageBox.Show("Can't Delete", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);


                statusJobBindingSource.DataSource = StatusJob_BLL.GetAll(frmMain.ship.Ship_ID);
            }

        }
        // Sự kiện nhân phím delete sảy ra
        private void gridView1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                DeleteStatusFinal();
            }
        }
        // Khởi tạo giá trị mặc định của ô cần ràng buộc
        private void gridView1_InitNewRow(object sender, DevExpress.XtraGrid.Views.Grid.InitNewRowEventArgs e)
        {
            status = Status.New;
        }
        // Kiểm tra ràng buộc của dữ liệu người dùng nhập vào
        private void gridView1_ValidateRow(object sender, DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e)
        {
            GridView view = (GridView)sender;
            GridColumn ColStatusName = view.Columns["StatusName"];

            if (null == view.GetRowCellValue(e.RowHandle, ColStatusName))
            {
                e.Valid = false;
                view.FocusedColumn = ColStatusName;
                e.ErrorText = "Please enter the Status Name. ";
                view.SetColumnError(ColStatusName, "Status Name cannot be empty");
                return;
            }
            objStatus = statusJobBindingSource.Current as  StatusJob;
            objStatus.Ship_ID = frmMain.ship.Ship_ID;

            if (StatusJob_BLL.IsExits(objStatus))
            {
                e.Valid = false;
                view.FocusedColumn = ColStatusName;
                e.ErrorText = "Status Name has existed. ";
                view.SetColumnError(ColStatusName, "Status Name has existed");
                return;
            }

        }
        // Thông báo lỗi nếu dữ liệu nhập vào không đúng
        private void gridView1_InvalidRowException(object sender, DevExpress.XtraGrid.Views.Base.InvalidRowExceptionEventArgs e)
        {
            if (e.RowHandle == GridControl.NewItemRowHandle)
            {
                e.WindowCaption = "Input Error";
            }
            else
            {
                e.ExceptionMode = DevExpress.XtraEditors.Controls.ExceptionMode.NoAction;
                DialogResult dr = XtraMessageBox.Show(gridControl1.LookAndFeel, this, e.ErrorText + GridLocalizer.Active.GetLocalizedString(GridStringId.ColumnViewExceptionMessage), e.WindowCaption, MessageBoxButtons.YesNo, MessageBoxIcon.Error);
                if (dr == DialogResult.No)
                {
                    e.ExceptionMode = DevExpress.XtraEditors.Controls.ExceptionMode.Ignore;
                    statusJobBindingSource.DataSource = StatusJob_BLL.GetAll(frmMain.ship.Ship_ID);
                    status = Status.Update;
                }
            }

        }
        // Đặt lại trạng thái update 
        private void gridView1_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
        {
            if (e.RowHandle != GridControl.NewItemRowHandle)
            {
                status = Status.Update;
            }
        }

        private void gridControl1_EmbeddedNavigator_ButtonClick(object sender, NavigatorButtonClickEventArgs e)
        {
            switch (e.Button.ButtonType)
            {
                case NavigatorButtonType.Remove:
                    DeleteStatus(e);
                    break;
            }
        }
    }
}